package 代码coding题OR模拟题;
import java.util.ArrayList;
import java.util.List;
/**
 * 简单的 模拟题 
 * @author I adore you
 *
 */
public class leetcode728自除数 {
	public static List<Integer> solution(int left,int right) {
//		  这是局部变量 要初始化的  不然 是没有 默认值的 会报错的
//		int count = 0;
		List<Integer> ans =new ArrayList<>();
		for(int i = left ;i <= right;i++) {
			if(process(i)) {
//				count++;
				ans.add(i);
			}
		}

//		return count;
		return ans;
	}
	public static boolean process(int value) {
//		if(value % 10 == 0) {
//			return false;
//		}
		int temp = value;
		int mod = 0;
		while(temp != 0) {
			mod = temp %10;
			if(mod == 0 || value % mod !=0) {
				return false;
			}
//			if(value % (temp % 10) != 0) {
//				return false;
//			}
			temp = temp / 10;
		}
		
		return true;
	}
	public static void main(String []args) {
		System.out.println(solution(47,85));
	}
}
/**
 * 理解  理性 打表     和 暴力 打表的 区别 
 * 这种  一般 数据 规模 都比较   小  不是henda
 * 然后 直接 枚举出所有的的答案  
 * 然后对答案 进行二分  
 * 
 * 打表  + 二分 答案 
 * 原来 是这个 意思 
 */
class Solution {
    static List<Integer> list = new ArrayList<>();
    static {
        out:for (int i = 1; i <= 10000; i++) {
            int cur = i;
            while (cur != 0) {
                int u = cur % 10;
                if (u == 0 || i % u != 0) continue out;
                cur /= 10;
            }
            list.add(i);
        }
    }
    public List<Integer> selfDividingNumbers(int left, int right) {
        List<Integer> ans = new ArrayList<>();
        int l = 0, r = list.size() - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (list.get(mid) >= left) r = mid;
            else l = mid + 1;
        }
        while (r < list.size() && list.get(r) <= right) ans.add(list.get(r++));
        return ans;
    }
}
/**
 * 
 * 打表 ＋hash表 
 * 但是 这个 很慢 啊 
 * 上面 那个 打表的 速度 还可以
 * 但是 这个 就比较慢 
 */
class SolutionOne {
    static List<Integer> list = new ArrayList<>();
    static int[] hash = new int[100010];
    static {
        for (int i = 1; i <= 10000; i++) {
            int cur = i;
            boolean ok = true;
            while (cur != 0 && ok) {
                int u = cur % 10;
                if (u == 0 || i % u != 0) ok = false;
                cur /= 10;
            }
            if (ok) list.add(i);
            hash[i] = list.size() - 1;
        }
    }
    public List<Integer> selfDividingNumbers(int left, int right) {
        List<Integer> ans = new ArrayList<>();
        int idx = list.get(hash[left]) == left ? hash[left] : hash[left] + 1;
        while (idx < list.size() && list.get(idx) <= right) ans.add(list.get(idx++));
        return ans;
    }
}



